<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Teacher
  Date: 2023/11/23
  Time: 9:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>EL表达式的用法</title>
</head>
<body>
<%--
    el 表示的语法 ${ java输出代码 } 替换 jsp表达式脚本 <%= request.getAttribute("变量名") %>
        +  <%= java输出代码 %> 直接获取当前jsp转换为的servlet类中service方法定义局部变量
        +  ${ java输出代码 } 只能获取定义在 HttpServletRequest 中的属性数据
--%>
    <%
        // servlet类中service方法 中的局部变量定义
        String msg = "测试变量msg";
        // 在HttpServletRequest请求对象中增加自定义属性
        request.setAttribute("info","测试变量info");

    %>
    <h4>变量获取范围</h4>
    <ul>
        <li>变量输出(小脚本=局部变量):<%= msg %></li>
        <li>变量输出(小脚本=匿名变量):<%= "字符串" %></li>
<%--        <li>变量输出(小脚本=request中的变量):<%= info %></li>--%>
        <li>变量输出(EL=局部变量):${ msg }</li>
        <li>变量输出(EL=匿名变量):${ "字符串" }</li>
        <li>变量输出(EL=request中的变量):${ info }</li>
    </ul>
    <h4>基本运算</h4>
    <ul>
        <li>数学运算:${ 100/25 }</li>
        <li>比较运算:${ 100>200 }</li>
            <% request.setAttribute("str",new String("aaa")); %>
            <% request.setAttribute("str1",new String("aaa")); %>
        <li>字符串的等值比较(equals):${ str.equals(str1) }</li>
        <%-- el 表达式中 字符串使用 == 进行比较时是会被替换成 equals 方法 --%>
        <li>字符串的等值比较(==):${ str==str1 }</li>
        <li>字符串的等值比较(eq):${ str eq str1 }</li>
        <li>字符串的等值比较(equals 取反):${ !str.equals(str1) }</li>
        <li>字符串的等值比较(ne):${ str ne str1 }</li>
        <li>三目运算符:${ 50>20?"是":"否" }</li>
        <li>逻辑运算(&&):${ true&&false }</li>
        <%-- 可以通过 and 关键子 替换 && --%>
        <li>逻辑运算(and):${ true and false }</li>
        <li>逻辑运算(||):${ true||false }</li>
        <%-- 可以通过 or 关键子 替换 || --%>
        <li>逻辑运算(or):${ true or false }</li>
        <li>内置方法的调用:${ "abcdef".length() }</li>
    </ul>
    <h4>jsp内置对象的获取(能够直接获取的只有pageContext,其它的内置对象都需要通过该对象调用)</h4>
    <ul>
        <li>pageContext:${ pageContext }</li>
        <li>request:${ pageContext.request }</li>
        <li>response:${ pageContext.response }</li>
        <li>out:${ pageContext.out }</li>
        <li>page:${ pageContext.page }</li>
        <li>config:${ pageContext.servletConfig }</li>
        <li>session:${ pageContext.session }</li>
        <li>application:${ pageContext.servletContext }</li>
<%--        <li>exception:${ pageContext.exception }</li>--%>
        <li>项目路径获取(静态资源路径拼接):${ pageContext.request.contextPath }</li>
    </ul>
    <h4>四个作用域</h4>
    <ul>
        <li>pageContext:${ pageScope }</li>
        <li>request:${ requestScope }</li>
        <li>session:${ sessionScope }</li>
        <li>application:${ applicationScope }</li>
    </ul>
    <p>通过作用域直接获取请求参数:${ param }</p>
    <p>通过作用域直接获取请求参数:${ param.a }</p>

    <h4>集合取值</h4>
    <%
        ArrayList<String> names = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            names.add( "tom"+i );
        }
    %>
    <ul>
        <li>脚本表达式:<%= names.get(3) %></li>
        <% request.setAttribute("names",names); %>
        <li>el表达式:${ names.get(3) }</li>
        <%-- el表达式对集合数据的取值提供统一语法 [下标] --%>
        <li>el表达式:${ names[3] }</li>
    </ul>
    <%
        HashMap<String,String> map = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            map.put("key"+i,"value"+i);
        }
    %>
    <ul>
        <li>脚本表达式:<%= map.get("key3") %></li>
        <% request.setAttribute("map",map); %>
        <li>el表达式:${ map.get("key3") }</li>
        <li>el表达式:${ map["key3"] }</li>
        <li>el表达式:${ map.key3 }</li>
    </ul>
</body>
</html>
